package io.renren.modules.task.rabbitmq;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 蔡翔
 * @Date: 2019/7/9 13:30
 * @Version 1.0
 */
@Configuration  //加这个注解说明就是一个配置文件
public class MQConfig {
    public static final String QUEUE = "queue";
    public static final String QUEUESS = "queuess";

    public static final String TOPIC_QUEUE1 = "topic.queue1";
    public static final String TOPIC_QUEUE2 = "topic.queue2";
    public static final String HEADERS_QUEUE = "headers.queue";



    public static final String TOPIC_EXCHANGE = "topic.exchange";
    public static final String ROUTING_KEY1 = "topic.key1";
    public static final String ROUTING_KEY2 = "topic.#";

    public static final String FANOUT_EXCHANGE = "fanout.exchange";
    public static final String HEADERS_EXCHANGE = "headers.exchange";
    public static final String ROUTING_KEY4 = "topic.#";

    /**
     * Direct模式,交换机Exchange   ； 交换机模式 是 消息投递并不是直接投递到队列上来，而是先投递到交换机上然后交换机负责分发到队列上。
     * */
    @Bean
    public Queue queue(){
        return new Queue(QUEUE,true); //第一个参数 消息队列的名称，第二个参数是否要做持久化。
    }

    @Bean
    public Queue queuess(){
        return new Queue(QUEUESS,true); //第一个参数 消息队列的名称，第二个参数是否要做持久化。
    }

    /**
     * Topic模式,交换机Exchange
     * */
    @Bean  //新建一个 队列
    public Queue topicQueue1(){
        return new Queue(TOPIC_QUEUE1,true);
    }

    @Bean
    public Queue topicQueue2(){
        return new Queue(TOPIC_QUEUE2,true);
    }

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange(TOPIC_EXCHANGE);
    }

    @Bean  //把队列 和路由绑定。
    public Binding topicBinding1(){
        return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1); //如果是topic.key1 那么是绑定到topicQueue1()上的
    }

    @Bean
    public Binding topicBinding2(){
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);//如果是topic.# 那么是绑定到topicQueue2()上的
    }

    /**
     * Fanout模式 交换机Exchange   （广播的交换机）
     * */
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange(FANOUT_EXCHANGE);
    }
    @Bean
    public Binding FanoutBinding1(){
        return BindingBuilder.bind(topicQueue1()).to(fanoutExchange());
    }

    @Bean
    public Binding FanoutBinding2(){
        return BindingBuilder.bind(topicQueue2()).to(fanoutExchange());
    }

    /**
     * Header模式 交换机Exchange
     * */
    @Bean       //定义一个交换机
    public HeadersExchange headersExchange(){
        return new HeadersExchange(HEADERS_EXCHANGE);
    }
    @Bean
    public Queue headersQueue(){
        return new Queue(HEADERS_QUEUE,true);
    }
    @Bean
    public Binding headerBinding(){
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("header1","value1");//绑定的时候 是需要指定  Header的
        map.put("header2","value2");//.whereAll(map).match() 是当交换机收到数据后，会判别匹配，只有当所有header 都满足才会往 headersQueue里面投放
        return BindingBuilder.bind(headersQueue()).to(headersExchange()).whereAll(map).match();
    }



}
